process.argv要讓程式能接收我們在終端機打的字(例如 node app.js myFolder),我們需要讀取 Node.js 的全域變數 process.argv。
實作練習:
在 hello-node 資料夾下,新增一個 cli.js:
// process.argv 會回傳一個陣列:
// [0] 是 node 執行檔的路徑
// [1] 是你執行的檔案路徑 (cli.js)
// [2] 之後才是你在終端機輸入的自訂參數
const args = process.argv;
console.log("收到的所有參數:", args);
// 我們通常只關心第 3 個位置 (索引值 2) 的自訂參數
const targetFolder = process.argv[2] || "沒有輸入參數";
console.log("你指定要分析的資料夾是:", targetFolder);
在終端機執行 node cli.js ./config。你會看到程式成功抓取了 ./config 這個字串。
現在清空 cli.js,我們要把前幾天學到的 fs/promises 與 path 完美結合。這個腳本會讀取目標資料夾,判斷它是檔案還是資料夾,並計算總大小與副檔名數量。
import { readdir, stat } from 'fs/promises';
import path from 'path';
// 取得使用者輸入的資料夾路徑,若沒輸入則預設為目前目錄
const targetDir = process.argv[2] || import.meta.dirname;
const analyzeFiles = async (dirPath) => {
try {
console.log(`\n 正在分析目錄:${dirPath}\n`);
// 讀取資料夾內容
const items = await readdir(dirPath);
let totalSize = 0;
let fileCount = 0;
let folderCount = 0;
const extCount = {};
// 逐一檢查資料夾內的每個項目
for (const item of items) {
// 組合出完整的絕對路徑
const fullPath = path.join(dirPath, item);
// 取得檔案狀態 (大小、類型等)
const itemStat = await stat(fullPath);
if (itemStat.isDirectory()) {
folderCount++;
} else if (itemStat.isFile()) {
fileCount++;
totalSize += itemStat.size; // 累加檔案大小 (單位:Bytes)
// 取得副檔名並統計
const ext = path.extname(item) || '無副檔名';
extCount[ext] = (extCount[ext] || 0) + 1;
}
}
// 輸出精美的分析報告
console.log(" 分析報告完成!");
console.log("---------------------------");
console.log(` 總資料夾數:${folderCount}`);
console.log(` 總檔案數:${fileCount}`);
console.log(` 總檔案大小:${(totalSize / 1024).toFixed(2)} KB`);
console.log(" 副檔名統計:", extCount);
console.log("---------------------------\n");
} catch (error) {
console.error(" 分析失敗,請確認路徑是否正確或是否有讀取權限。");
console.error("錯誤訊息:", error.message);
}
};
// 執行主程式
analyzeFiles(targetDir);
回到終端機,試著用你的程式去分析不同的資料夾:
分析目前資料夾(不加參數):node cli.js
分析上一層資料夾:node cli.js ../
分析電腦裡的某個特定路徑(請換成你電腦實際存在的路徑):node cli.js C:\Users 或 node cli.js /usr/local
如果終端機順利印出漂亮的統計報表,恭喜你!你已經正式脫離了 Node.js 的新手村。你不再只會在瀏覽器裡操作 DOM,你現在具備了控制作業系統底層檔案的能力。